package com.tedu.ourprojct.controller;


import com.tarena.mnmp.api.SendParam;
import com.tedu.ourprojct.mapper.UserMapper;
import com.tedu.ourprojct.pojo.dto.*;
import com.tedu.ourprojct.pojo.entity.User;
import com.tedu.ourprojct.pojo.vo.UserInfoVo;
import com.tedu.ourprojct.pojo.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Random;

/**
 * 用户信息处理类
 * @author 张子豪
 */
@Slf4j
@RestController
public class UserController {
    @Autowired(required = false)
    private UserMapper mapper;


    /**
     * 获取手机验证码方法
     * @param phoneNum 客户端传递过来的手机号吗？
     * @param session  穿件会话对象存储生成的验证码信息
     */
    @RequestMapping("/verificationCode")
    public void verificationCode(String phoneNum, HttpSession session) {
        log.info(phoneNum);
        //发送参数对象
        String code = randomCode();
        log.info(code);
        //将获取到的验证码存放到会话对象中。
        session.setAttribute("code",code);
        SendParam param = new SendParam.DefaultSendParam().defaultSendParam(code, phoneNum);
        //借助Spring提供的RestTemplate
        new RestTemplate().postForObject(
                "Http://124.71.224.210:8082/send/sms", param, String.class
        );//向消息中台发送一个Http请求。
    }

    /**
     * 用户注册方法
     * @param user 接收客户端用户注册差un过来的信息
     * @param session 会话对象提供存储的验证码信息
     * @return
     */
    @RequestMapping("/reg")
    public int reg(@RequestBody UserRegDto user,HttpSession session) {
        System.out.println("user=" + user);
        //将存放到会话对象中的验证码取出
        String code=(String) session.getAttribute("code");
        if (user.getCode().equals(code)) {//将会话对象中的验证码同客户端中传入的验证码比对为真则执行下方代码。
            //通过用户输入的用户名查询数据库里面的用户数据
            UserVO userVO = mapper.selectByUsername(user.getUsername());
            if (userVO != null) {//如过该用户已存在则表示该用户名已经被注册
                return 2;//代表用户已经存在了
            }
            //用户对象实例化
            User u = new User();
            //将客户端传入的数据复制到实例化的用户对象中
            BeanUtils.copyProperties(user, u);
            //设置该用户创建的时间
            u.setGmtCreate(LocalDateTime.now());
            System.out.println(u);
            //将实例化用户数据存放到数据库中。
            mapper.insert(u);
            return 1;
        }
        return 3;
    }

    /**
     * 员工帐号设置方法
     * @param user 接收客户端传递过来的员工帐号设置信息
     * @return
     */
    @RequestMapping("/insertStaff")
    public Integer insertStaff(@RequestBody UserStaff user){
        //通过客户端传过来的用户名信息获取数据库中对应的用户信息
        UserVO userVO=mapper.selectByUsername(user.getUsername());
        if (userVO!=null){//如过该用户不为空则表示该用户名已被注册
            return 2;
        }
        if (user.getPhoneNum().length()!=11){
            return 3;
        }
        //实例化entityUser对象
        User u=new User();
        //将设置员工的账户信息复制给u
        BeanUtils.copyProperties(user,u);
        //设置该对象创建的时间
        u.setGmtCreate(LocalDateTime.now());
        //将entityUser对象数据存储到数据库中
        mapper.insertStaff(u);
        return 1;
    }

    /**
     * 用户登录方法
     * @param user 接收客户端传递过来的登录信息
     * @param session 会话对象存储登录用户
     * @return
     */
    @RequestMapping("/login")
    public int login(@RequestBody UserLoginDto user, HttpSession session, HttpServletResponse response){
        //通过前端输入的用户名获取数据库中对应的用户信息
        UserVO userVO= mapper.selectByUsername(user.getUsername());
        if (userVO!=null){//如果获取到的用户对象不为null则表示数据库中存在该对象
            if (user.getRole()==userVO.getRole()&&user.getPassword().equals(userVO.getPassword())){//如果客户端传来的密码同数据库中密码相匹配额则执行一下代码
                session.setAttribute("user",userVO);//将该用户存入到会话对象中
                if (user.getRem()){
                    Cookie c1=new Cookie("username",user.getUsername());
                    Cookie c2=new Cookie("password",user.getPassword());
                    Cookie c3=new Cookie("role",user.getRole().toString());
                    c1.setMaxAge(60*60*24*30);
                    c3.setMaxAge(60*60*24*30);
                    response.addCookie(c1);
                    response.addCookie(c2);
                    response.addCookie(c3);
                }
                if (user.getRole()==1){//如果权限等级为1则给客户端返回数字1
                    return 1;
                }else if (user.getRole()==2){//如果权限等级为2则给客户端返回一个2
                    return 2;
                }else if (user.getRole()==3){//如果权限等级为3则给客户端返回一个3
                    return 3;
                }else {//如果权限等级为4则给客户端返回一个4
                    return 4;
                }
            }else {//如果客户端传来的密码同数据库中密码不匹配则返还给客户端一个5
                return 5;
            }
        }
        //如过同过用户名查询无此对象则给客户端回复一个6
        return 6;
    }

    @RequestMapping("/phoneNumLogin")
    public int phoneNumLogin(@RequestBody UserPhoneNumLoginDto user, HttpSession session, HttpServletResponse response){
        //通过前端输入的用户名获取数据库中对应的用户信息
        UserVO userVO= mapper.selectByPhoneNum(user.getPhoneNum());
        String code=(String) session.getAttribute("code");
        if (userVO!=null){//如果获取到的用户对象不为null则表示数据库中存在该对象
            if (user.getCode().equals(code)){//如果客户端传来的密码同数据库中密码相匹配额则执行一下代码
                session.setAttribute("user",userVO);//将该用户存入到会话对象中
                if (userVO.getRole()==1){//如果权限等级为1则给客户端返回数字1
                    return 1;
                }else if (userVO.getRole()==2){//如果权限等级为2则给客户端返回一个2
                    return 2;
                }else if (userVO.getRole()==3){//如果权限等级为3则给客户端返回一个3
                    return 3;
                }else {//如果权限等级为4则给客户端返回一个4
                    return 4;
                }
            }else {//如果客户端传来的密码同数据库中密码不匹配则返还给客户端一个5
                return 5;
            }
        }
        //如过同过用户名查询无此对象则给客户端回复一个6
        return 6;
    }

    /**
     * 获取用户信息方法
     * @return
     */
    @RequestMapping("/selectUser")
    public List<UserInfoVo> selectUser(Integer role) {
        return mapper.selectUser();
    }

    /**
     * 修改用户信息方法
     */
    @RequestMapping("/updateUser")
    public void updateUser(@RequestBody UserUpdateDto user){
        mapper.updateUser(user);
    }
    /**
     * 删除用户信息方法
     */
    @RequestMapping("/deleteUser")
    public void deleteUser(int id){
        mapper.deleteById(id);
    }
    /**
     * 获取员工信息方法
     */
    @RequestMapping("/selectStaff")
    public List<UserInfoVo> selectStaff(){
        return mapper.selectStaff();
    }
    /**
     * 修改员工信息方法
     */
    @RequestMapping("/updateStaff")
    public void updateStaff(@RequestBody UserUpdateDto user){
        mapper.updateUser(user);
    }
    /**
     * 删除员工方法
     */
    @RequestMapping("/deleteStaff")
    public void deleteStaff(Integer id){
        mapper.deleteById(id);
    }

    /**
     * 退出登录方法
     * @param session 会话对象提供其存储的登录用户
     */
    @RequestMapping("/logout")
    public void logout(HttpSession session){
        session.removeAttribute("user");//将登录对象从会话对象中删除出去
    }

    private static String randomCode() {
        StringBuilder builder = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            String code = random.nextInt(10) + "";
            builder.append(code);
        }
        return String.valueOf(builder).trim();
    }//随机生成六位数验证码

}
